package org.linkality.xacmlanalysr.ui.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DecoratedStackPanel;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class Analysr implements EntryPoint {
public final String CONTROLLER_URL = GWT.getModuleBaseURL() + "controller";
DecoratorPanel rightContent;
HTML fileName = new HTML();
HTML combiningAlgorithm = new HTML();
HTML rulesCount = new HTML();
HTML version = new HTML();
HTML description = new HTML();
ServerControllerAsync controllerService = (ServerControllerAsync) GWT.create(ServerController.class);
ServiceDefTarget controllerServiceEndpoint = (ServiceDefTarget) controllerService;
public Analysr() {
super();
controllerServiceEndpoint.setServiceEntryPoint(CONTROLLER_URL);
}
/**
* This is the entry point method.
*/
public void onModuleLoad() {
retrieveInfo();
RootPanel.get("leftPart").add(getLeftMenu());
VerticalPanel rightVPanel = new VerticalPanel();
rightVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
rightVPanel.setWidth("500px");
rightVPanel.setHeight("300px");
rightVPanel.addStyleName("rightVPanel");
rightVPanel.add(getInfoPanel());
rightContent = new DecoratorPanel();
rightContent.setWidget(rightVPanel);
RootPanel.get("rightPart").add(rightContent);
RootPanel.get("topPart").add(getTopPart());
}
private Widget getTopPart() {
HorizontalPanel horizPanel = new HorizontalPanel();
horizPanel.setWidth("750px");
horizPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
horizPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
HTML title = new HTML("<img src=\"analysr.png\"><br><b>semantic</b>xacml<b>analysis</b><br> ");
title.addStyleName("mainTitle");
title.setWidth("100%");
horizPanel.add(title);
horizPanel.setCellWidth(title, "500px");
horizPanel.setCellHorizontalAlignment(title, HasHorizontalAlignment.ALIGN_LEFT);
// Image hydra = new Image("hydralogo.gif");
// hydra.setHeight("50px");
// horizPanel.add(hydra);
//
// Image sit = new Image("sit_logo.gif");
// sit.setHeight("50px");
// horizPanel.add(sit);
return horizPanel;
}
private VerticalPanel getLeftMenu() {
VerticalPanel leftVPanel = new VerticalPanel();
leftVPanel.setWidth("100%");
leftVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
// Create a new stack panel
DecoratedStackPanel stackPanel = new DecoratedStackPanel();
stackPanel.setWidth("200px");
stackPanel.setTitle("Menu");
stackPanel.setHeight("310px");
// Add image and button to the RootPanel
RootPanel.get("leftPart").add(leftVPanel);
// Add the stack folders
VerticalPanel analysisEntries = new VerticalPanel();
analysisEntries.addStyleName("menu");
HTML entryExplainOutcomes = new HTML("<a href=\"#\">Explain effects</a>");
HTML entryGetRequiredAttributes = new HTML("<a href=\"#\">Get required attributes</a>");
analysisEntries.add(entryExplainOutcomes);
analysisEntries.add(entryGetRequiredAttributes);
analysisEntries.add(new HTML("More to come ..."));
VerticalPanel mainEntries = new VerticalPanel();
mainEntries.addStyleName("menu");
HTML entryExportToOWL = new HTML("<a href=\"#\">Export to OWL</a>");
HTML entryExportToProlog = new HTML("<a href=\"#\">Export to Prolog</a>");
HTML entryUploadXACML = new HTML("<a href=\"#\">Upload XACML file</a>");
HTML entryCheckConsistency = new HTML("<a href=\"#\">Check consistency</a>");
mainEntries.add(entryUploadXACML);
mainEntries.add(entryExportToOWL);
mainEntries.add(entryExportToProlog);
VerticalPanel validateEntries = new VerticalPanel();
validateEntries.addStyleName("menu");
validateEntries.add(entryCheckConsistency);
validateEntries.add(new HTML("More to come"));
String mainHeader = "Transformation";
String analysisHeader = "Analysis";
String validationHeader = "Validation";
stackPanel.add(mainEntries, mainHeader, true);
stackPanel.add(validateEntries, validationHeader, true);
stackPanel.add(analysisEntries, analysisHeader, true);
leftVPanel.add(stackPanel);
final UploadDialogBox dialogBox = new UploadDialogBox();
entryGetRequiredAttributes.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
rightContent.setWidget(getRequiredAttributesPanel());
}
});
entryExplainOutcomes.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
rightContent.setWidget(getExplanationPanel());
}
});
entryExportToOWL.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
rightContent.setWidget(getPanelExportToOWL());
}
});
entryExportToProlog.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
rightContent.setWidget(getPanelExportToProlog());
}
});
entryCheckConsistency.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONObject resultObj = (JSONObject) JSONParser.parse((String) result);
String res = ((JSONString) resultObj.get("result")).stringValue();
if (res.equals("true")) {
res = "Congratulations!\n\nThe consistency check passed. That means the structure of your policy is XACML compliant";
}
showMessageBox("Consistency check", res);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
// Textarea displays any exception messages
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
// Call the service method, validating the form
// values first.
try {
JSONObject req = new JSONObject();
req.put("action", new JSONString("checkConsistency"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
entryUploadXACML.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
dialogBox.center();
dialogBox.show();
}
});
return leftVPanel;
}
private DialogBox showMessageBox(String title, String text) {
// Create a dialog box and set the caption text
final DialogBox dialogBox = new DialogBox();
dialogBox.ensureDebugId("cwDialogBox");
dialogBox.setText(title);
dialogBox.setAnimationEnabled(true);
// Create a table to layout the content
VerticalPanel dialogContents = new VerticalPanel();
dialogContents.setSpacing(4);
// dialogContents.setSize("500px", "400px");
dialogBox.setWidget(dialogContents);
// Add some text to the top of the dialog
HTML details = new HTML();
dialogContents.ensureDebugId("dialogboxcontent");
details.setText(text);
details.setWordWrap(true);
// dialogContents.setWidth("500px");
// dialogContents.setHeight("400px");
details.addStyleName("message_box_text");
// details.setReadOnly(true);
dialogContents.add(details);
dialogContents.setCellHorizontalAlignment(details, HasHorizontalAlignment.ALIGN_CENTER);
// Add a close button at the bottom of the dialog
Button closeButton = new Button("Close", new ClickListener() {
public void onClick(Widget sender) {
dialogBox.hide();
}
});
dialogContents.add(closeButton);
if (LocaleInfo.getCurrentLocale().isRTL()) {
dialogContents.setCellHorizontalAlignment(closeButton, HasHorizontalAlignment.ALIGN_LEFT);
} else {
dialogContents.setCellHorizontalAlignment(closeButton, HasHorizontalAlignment.ALIGN_RIGHT);
}
dialogBox.center();
dialogBox.show();
// Return the dialog box
return dialogBox;
}
private VerticalPanel getExplanationPanel() {
VerticalPanel vertPanel = new VerticalPanel();
vertPanel.setSize("450px", "300px");
FlexTable layout = new FlexTable();
layout.setCellSpacing(6);
// Add a title to the form
layout.setHTML(0, 0, "<b>Get explained the effects of your policy</b>");
layout.getFlexCellFormatter().setColSpan(0, 0, 2);
layout.getFlexCellFormatter().setHeight(0, 0, "30px");
layout.setBorderWidth(0);
layout.setWidth("450px");
// Add some standard form options
Hidden actionParam = new Hidden("action", "getExplanation");
vertPanel.add(actionParam);
// Make a new list box, adding a few items to it.
final ListBox lbTargets = new ListBox();
final ListBox lbEffects = new ListBox();
lbEffects.setName("effect");
lbTargets.setName("target");
lbEffects.addItem("permit");
lbEffects.addItem("deny");
getPolicyTargets(lbTargets);
lbTargets.setVisibleItemCount(1);
layout.setHTML(1, 0, "<b>Select the target</b>");
layout.setWidget(1, 1, lbTargets);
layout.setHTML(2, 0, "<b>Select the effect</b>");
layout.setWidget(2, 1, lbEffects);
Button button = new Button();
button.setText("Explain!");
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONObject resultObj = (JSONObject) JSONParser.parse((String) result);
JSONArray res = ((JSONArray) resultObj.get("result"));
String messageText = "";
for (int i=0;i<res.size();i++) {
messageText += res.get(i) + "\n";
}
showMessageBox("Explanation", messageText);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
JSONObject req = new JSONObject();
req.put("target", new JSONString(lbTargets.getItemText(lbTargets.getSelectedIndex())));
req.put("effect", new JSONString(lbEffects.getItemText(lbEffects.getSelectedIndex())));
req.put("action", new JSONString("getExplanation"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}});
vertPanel.add(layout);
vertPanel.add(button);
return vertPanel;
}
private VerticalPanel getRequiredAttributesPanel() {
VerticalPanel vertPanel = new VerticalPanel();
vertPanel.setSize("450px", "300px");
FlexTable layout = new FlexTable();
layout.setCellSpacing(6);
// Add a title to the form
layout.setHTML(0, 0, "<b>Find out which attributes are required to evaluate a request</b>");
layout.getFlexCellFormatter().setColSpan(0, 0, 2);
layout.getFlexCellFormatter().setHeight(0, 0, "30px");
layout.setBorderWidth(0);
layout.setWidth("450px");
// Add some standard form options
Hidden actionParam = new Hidden("action", "getRequiredAttributes");
vertPanel.add(actionParam);
// Make a new list box, adding a few items to it.
final ListBox lbTargets = new ListBox();
final ListBox lbEffects = new ListBox();
lbEffects.setName("effect");
lbTargets.setName("target");
lbEffects.addItem("permit");
lbEffects.addItem("deny");
getPolicyTargets(lbTargets);
lbTargets.setVisibleItemCount(1);
layout.setHTML(1, 0, "<b>Select the target</b>");
layout.setWidget(1, 1, lbTargets);
Button button = new Button();
button.setText("Find out!");
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONObject resultObj = (JSONObject) JSONParser.parse((String) result);
JSONArray res = ((JSONArray) resultObj.get("result"));
String messageText = "";
for (int i=0;i<res.size();i++) {
messageText += res.get(i) + "\n";
}
showMessageBox("Required attributes", messageText);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
JSONObject req = new JSONObject();
req.put("target", new JSONString(lbTargets.getItemText(lbTargets.getSelectedIndex())));
req.put("effect", new JSONString(lbEffects.getItemText(lbEffects.getSelectedIndex())));
req.put("action", new JSONString("getRequiredAttributes"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}});
layout.setWidget(2, 1, button);
vertPanel.add(layout);
return vertPanel;
}
private VerticalPanel getInfoPanel() {
FlexTable layout = new FlexTable();
layout.setCellSpacing(6);
// Add a title to the form
layout.setHTML(0, 0, "<b>Information about your policy</b>");
layout.getFlexCellFormatter().setColSpan(0, 0, 2);
layout.getFlexCellFormatter().setHeight(0, 0, "30px");
layout.setBorderWidth(0);
layout.setWidth("450px");
// Add some standard form options
layout.setHTML(1, 0, "<b>File name</b>");
layout.setWidget(1, 1, fileName);
layout.setHTML(2, 0, "<b>Combining Algorithm</b>");
layout.setWidget(2, 1, combiningAlgorithm);
layout.setHTML(3, 0, "<b>Version</b>");
layout.setWidget(3, 1, version);
layout.setHTML(4, 0, "<b>Description</b>");
layout.setWidget(4, 1, description);
VerticalPanel vPanel = new VerticalPanel();
vPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
vPanel.add(layout);
return vPanel;
}
public void getPolicyTargets(final ListBox lb) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONArray resultObj = (JSONArray) JSONParser.parse((String) result);
for (int i=0;i<resultObj.size();i++) {
lb.addItem(((JSONString) resultObj.get(i)).stringValue());
}
System.out.println("Done. " + description);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
System.out.println("Get targets");
JSONObject req = new JSONObject();
req.put("action", new JSONString("getPolicyTargets"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void retrieveInfo() {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONArray resultObj = (JSONArray) JSONParser.parse((String) result);
String res = resultObj.toString();
version.setText(resultObj.get(0).toString());
fileName.setText(resultObj.get(1).toString());
combiningAlgorithm.setText(resultObj.get(2).toString());
description.setText(resultObj.get(3).toString());
System.out.println("Done. " + description);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
JSONObject req = new JSONObject();
req.put("action", new JSONString("getInfo"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public final Widget getPanelExportToOWL() {
VerticalPanel vertPanel = new VerticalPanel();
vertPanel.setSize("500px","300px");
Button button = new Button("Export to OWL!");
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONObject resultObj = (JSONObject) JSONParser.parse((String) result);
String res = ((JSONString) resultObj.get("result")).stringValue();
showMessageBox("Policy in OWL format", res);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
JSONObject req = new JSONObject();
req.put("action", new JSONString("getAsOWL"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} });
vertPanel.add(new HTML("Convert the policy to an ontology representation in OWL"));
vertPanel.add(button);
vertPanel.setCellHorizontalAlignment(button, HasHorizontalAlignment.ALIGN_CENTER);
return vertPanel;
}
public final Widget getPanelExportToProlog() {
VerticalPanel vertPanel = new VerticalPanel();
vertPanel.setSize("500px","300px");
Button button = new Button("Export to Prolog!");
button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
try {
AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
JSONObject resultObj = (JSONObject) JSONParser.parse((String) result);
String res = ((JSONString) resultObj.get("result")).stringValue();
showMessageBox("Policy in Prolog format", res);
}
public void onFailure(Throwable caught) {
showMessageBox("Server request failed", caught.getMessage());
System.out.println("Server request raised an error; Java exception : "
+ caught == null ? "An unknown exception"
: caught.getMessage());
}
};
try {
JSONObject req = new JSONObject();
req.put("action", new JSONString("getAsProlog"));
controllerService.handleRequest(req.toString(), callback);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} });
vertPanel.add(new HTML("Convert the policy to a first-order-logic representation in Prolog"));
vertPanel.add(button);
vertPanel.setCellHorizontalAlignment(button, HasHorizontalAlignment.ALIGN_CENTER);
return vertPanel;
}
}